package com.exm.collectcodenew.timer;

import java.util.Timer;
import java.util.TimerTask;
//Timer是固定的多线程生产单线程消费，但是但是ScheduledThreadPoolExecutor 是可以配置的，既可以是多线程生产单线程消费也可以是多线程生产多线程消费，
// 所以在日常开发中使用定时器功能时应该优先使用ScheduledThreadPoolExecutor。
//当任务在执行的过程中抛出InterruptedException在外的异常时，唯一的消费线程就会因为抛出异常而终止，那么队列里的其他待执行的任务就会被清除。
//所以在TimerTask的run 方法内最好使用 try-catch 结构捕捉可能的异常，不要把异常抛到run方法之外。其实要实现 Timer 功能，
// 使用 ScheduledThreadPoolExecutor 的schedule是比较好的选择。如果ScheduledThreadPoolExecutor中的一个任务抛出异常，其他任务则不受影响。
public class TestTimer {
    //创建定时器对象
    static Timer timer =new Timer();
    public static void main(String[] args) throws InterruptedException {
        //添加任务1，延迟500ms执行
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("---one Task---");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                throw new RuntimeException("error");
            }
        },500);
        //添加任务2，延迟1000ms执行
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("---two Task---");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                throw new RuntimeException("error");
            }
        },1000);
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("测试Timer类");
            }
        }, 1000, 1000);
        Thread.sleep(10000);
        timer.cancel();
    }
}
